//
//  main.m
//  OC02_方法
//
//  Created by dllo on 15/12/1.
//  Copyright © 2015年 dllo. All rights reserved.
//

#import <Foundation/Foundation.h>
#import "Person.h"
#import "Student.h"
#import "CollegeStudent.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {

#pragma mark - 知识点1 OC的方法语法
        
        /** 
         * OC 方法分 '+'类方法和'-'对象方法 
         * '+'类方法中不能有实例变量 
         * !!! 使用方法时, 必须明确方法是类方法还是对象方法
         */
        
        // - (NSString *)substringFromIndex:(NSUInteger)anIndex
        /** 上面的方法. 其中
         * '-' 说明是对象方法, 只能对象调用此方法!!!
         * 返回值类型为 'NSString *'(字符串)
         * 
         * 'substringFromIndex' 参数的形容词
         *
         * ':'说明后面有参数
         *
         * '(NSUInteger)' 参数类型
         *
         * 'anIndex' 参数名
         *
         * 方法名 substringFromIndex:  注意 带冒号
         */
        
        
        // - (void)insertString:(NSString *)aString atIndex:(NSUInteger)anIndex
        
#pragma mark - 知识点2 setter, getter方法

        /** 
         * 实例变量默认的可见度是 @protected, 外部不能直接访问(赋值\取值) 
         *
         * 通过方法间接的对实例变量进行访问
         *
         * 涉及到两个方法,即赋值方法(setter), 取值方法(getter)
         *
         *
         */
        
        /** 创建对象 */
        Person *per1 = [[Person alloc] init];
        
        /** 通过setter和getter方法访问实例变量 */
        [per1 setName:@"王强"];
        [per1 setAge:50];
        [per1 setSex:@"中性"];
        
        NSLog(@"name:%@", [per1 name]);
        NSLog(@"age:%ld", [per1 age]);
        NSLog(@"sex:%@", [per1 sex]);
        
#pragma mark - 知识点3 继承
        /** 子类继承父类所有的实例变量和方法. 实例变量可见度为@private私有的, 同样继承下来 */
        
        
        /** Student类继承于Person类 */
        Student *stu1 = [[Student alloc] init];
        [stu1 setName:@"王艳"];
        [stu1 setAge:60];
        [stu1 setSex:@"男性"];
        [stu1 setSchool:@"蓝鸥"];
        [stu1 setNumber:1];
        
        NSLog(@"school:%@", [stu1 school]);
        
        [stu1 study];
        
        CollegeStudent *collStu1 = [[CollegeStudent alloc] init];
        [collStu1 study];
        
#pragma mark - 知识点4 初始化方法(详见Person类)
        
        /** 创建一个Person对象, 并且实例变量赋值 */
        Person *person5 = [[Person alloc] init];
        
        [person5 setName:@"黑6"];
        [person5 setAge:50];
        [person5 setSex:@"中性"];
        
        Person *person6 = [[Person alloc] initWithName:@"王强" age:15 sex:@"女"];
        
#pragma mark - 知识点5 便利构造器方法(详见Person类)
        
        Person *person7 = [Person personWithName:@"王强" age:50 sex:@"女"];
        
        Person *person8 = [Person person];
       
    }
    return 0;
}
